﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cocon90.Lib.Dal.Store
{

    /// <summary>
    /// Store接口 表示一个指定Model类型的数据集
    /// </summary>
    public interface IStore<T> where T : class ,Rule.IModel, new()
    {
        /// <summary>
        /// 表示当数据加载完成或改变时触发
        /// </summary>
        event DataChanged OnDataChanged;
        /// <summary>
        /// 设置过滤的事件。
        /// </summary>
        event FilterDelegate FilterFunction;
        /// <summary>
        /// 最初取得的数据的集合，后期一直被用做数据缓冲集
        /// </summary>
        List<T> StaticData { get; set; }
        /// <summary>
        /// 获取此Store所代表的Model类型
        /// </summary>
        Type Model { get; }
        /// <summary>
        /// 当前提供数据访问的数据集
        /// </summary>
        List<T> Data { get; set; }
        /// <summary>
        /// 强行重加载缓冲数据一次，但需要用户通过Load或LoadFrom方法才参得到强加载的数据。
        /// </summary>
        void ForceLoadStaticDataOneTime();
        /// <summary>
        /// 开始加载数据，需指定SelectSQLString，并指示过滤器（Filter方法）是否启用，启用后会影响性能。
        /// </summary>
        void Load(bool isNeedFilter = false);
        /// <summary>
        ///获取或设置 Load方法加载数据源时要使用的Sql语句，默认是：“select * from DATATABLE”
        /// </summary>
        string SelectSQLString { get; set; }
        /// <summary>
        /// 取得原始的SelectSQLString
        /// </summary>
        string OldSelectSQLString { get; }
        /// <summary>
        /// 由数据表做为数据源来加载数据，并指示过滤器（Filter方法）是否启用，启用后会影响性能。
        /// </summary>
        /// <param name="dataTable"></param>
        void LoadFrom(System.Data.DataTable dataTable, bool isNeedFilter = false);
        /// <summary>
        /// 一次向数据库中请求的页数。
        /// </summary>
        int PageCountOneTimeLoad { get; set; }
        /// <summary>
        ///获取或设置 每页显示的记录数(默认是20条)
        /// </summary>
        int PageSize { get; set; }
        /// <summary>
        ///获取或设置 当前页数(默认是第1页)
        /// </summary>
        int PageNumber { get; set; }
        /// <summary>
        ///获取 缓冲数据集的次取的记录数。
        /// </summary>
        int StaticPageSize { get; }
        /// <summary>
        ///获取 缓冲数据集当前取第几页的数据。
        /// </summary>
        int StaticPageNumber { get; }
        /// <summary>
        /// 获取当前SelectSQLString语句对应到的记录总数。
        /// </summary>
        int GetAllRowCount();
        /// <summary>
        /// 获取或设置 当前Store读取数据时使用的排序方式是否为升序。默认为false
        /// </summary>
        bool IsAsc { get; set; }
        /// <summary>
        /// 自定义过滤器，返回True的列将被留下
        /// </summary>


    }
    /// <summary>
    /// 表示当数据加载完成或改变时触发
    /// </summary>
    /// <param name="data">导向用户的数据</param>
    /// <param name="staticData">数据集内部的缓冲数据，它包含了导向用户的数据</param>
    /// <param name="pageNumber">当前页</param>
    /// <param name="pageSize">导出的数据中每页的记录数</param>
    /// <param name="staticPageNumber">缓冲数据向数据库取数据时，所取的数据页数</param>
    /// <param name="staticPageSize">缓冲数据向数据库取数据时，每次所取的记录总数</param>
    public delegate void DataChanged(object data, object staticData, int pageNumber, int pageSize, int staticPageNumber, int staticPageSize);
    /// <summary>
    /// 过滤时使用的方法委托
    /// </summary>
    /// <param name="index">当前数据所以缓冲数据库的行索引</param>
    /// <param name="propertie">当前列属性</param>
    /// <param name="value">当前列对应的值</param>
    /// <returns></returns>
    public delegate bool FilterDelegate(int index, string propertie, object value);
}
